//业务处理方法,全部可以由开发覆盖
let methods = {
  //当添加扩展组件gridHeader/gridBody/gridFooter及明细modelHeader/modelBody/modelFooter时，
  //如果要获取父级Vue对象,请使用此方法进行回调
  parentCall(fun) {
    if (typeof fun != 'function') {
      return console.log('扩展组件需要传入一个回调方法才能获取父级Vue对象');
    }
    fun(this);
  },

  //获取搜索参数
  getSearchParameters() {
    //处理日期格式
    let params = {};
    this.searchFormOptions.forEach((item, index) => {
      if (item instanceof Array) {
        item.forEach((x) => {
          if (x.type == 'date' || x.type == 'datetime') {
            if (x.range) {
              if (this.searchFormFields[x.name] && this.searchFormFields[x.name].length > 0) {
                params[x.name + 'Start'] = this.searchFormFields[x.name][0];
                params[x.name + 'End'] = this.searchFormFields[x.name][1];
              }
            } else {
              params[x.name] = this.searchFormFields[x.name];
            }
          } else if (x.type == 'radio' || x.type == 'checkbox' || x.type == 'select') {
            params[x.name] = this.searchFormFields[x.name];
          } else if (x.type == 'input' || x.type == 'textarea' || x.type == 'number') {
            params[x.name] = this.searchFormFields[x.name];
          } else if (x.type == 'upload' || x.type == 'file') {
            params[x.name] = this.searchFormFields[x.name];
          }
        });
      }
    });
    //处理快速查询
    if (this.singleSearch && this.singleSearch.field && this.searchFormFields[this.singleSearch.field]) {
      if (!this.fiexdSearchForm) {
        this.searchBoxShow = false;
      }
      params[this.singleSearch.field] = this.searchFormFields[this.singleSearch.field];
    }
    return params;
  },

  //搜索
  search() {
    if (this.$refs.table) {
      this.$refs.table.load();
    }
  },

  //表格加载前
  loadTableBefore(params) {
    return params;
  },

  //表格加载后
  loadTableAfter() {
    
  },

  //获取搜索条件项
  getSearchItem(name) {
    let item = null;
    for (let i = 0; i < this.searchFormOptions.length; i++) {
      if (this.searchFormOptions[i] instanceof Array) {
        for (let j = 0; j < this.searchFormOptions[i].length; j++) {
          if (this.searchFormOptions[i][j].name == name) {
            item = this.searchFormOptions[i][j];
            break;
          }
        }
      }
    }
    return item;
  },

  //重置搜索
  resetSearch() {
    this.resetSearchForm();
    if (this.$refs.table) {
      this.$refs.table.load();
    }
  },

  //重置搜索表单
  resetSearchForm() {
    this.resetForm();
    //重置快速搜索
    if (this.singleSearch && this.singleSearch.field) {
      this.searchFormFields[this.singleSearch.field] = '';
    }
  },

  //重置表单
  resetForm() {
    //重置表单数据
    this.searchFormOptions.forEach((item) => {
      if (item instanceof Array) {
        item.forEach((x) => {
          this.searchFormFields[x.name] = this.emptyValue(x.type);
        });
      }
    });
  },

  //空值处理
  emptyValue(type) {
    switch (type) {
      case 'checkbox':
        return [];
      case 'number':
        return null;
      default:
        return '';
    }
  },

  //搜索前
  searchBefore(params) {
    return params;
  },

  //搜索后
  searchAfter(data) {
    
  },

  //获取按钮
  getButtons() {
    //生成界面的操作按钮及更多选项
    let searchIndex = this.buttons.findIndex((x) => {
      return x.value == 'Search';
    });
    //添加高级查询
    let hasOneFormItem = 
      this.searchFormOptions.length == 1 && 
      this.searchFormOptions[0].length == 1;
    if (searchIndex != -1 && !hasOneFormItem) {
      this.buttons.splice(searchIndex + 1, 0, {
        icon: this.fiexdSearchForm ? 'el-icon-refresh-left' : 'el-icon-search',
        name: this.fiexdSearchForm ? '重置' : '高级查询',
        plain: true,
        type: this.buttons[searchIndex].type,
        onClick: () => {
          if (this.fiexdSearchForm) {
            return this.resetSearch();
          }
          this.searchBoxShow = !this.searchBoxShow;
        }
      });
    }
    if (hasOneFormItem) {
      this.fiexdSearchForm = false;
    }
    this.maxBtnLength += searchIndex == -1 ? 0 : 1;
  },

  //扩展按钮
  extendBtn(btns, source) {
    //btns权限按钮，source为扩展按钮
    if (!btns || !(source && source instanceof Array)) {
      return;
    }
    //source通过在表的扩展js文件中buttons对应按钮的属性index决定按钮所放位置
    source.forEach((x) => {
      //通过按钮的Index属性，放到指定的位置
      btns.splice(x.index == undefined ? btns.length : x.index, 0, x);
    });
  },

  //初始化字典数据
  initDicKeys() {
    //初始化字典数据
    let keys = [];
    //优化重新加载数据源
    if (this.dicKeys && Array.isArray(this.dicKeys)) {
      this.dicKeys.forEach((item) => {
        item.data.splice(0);
        item.orginData && item.orginData.splice(0);
      });
    }
    //初始化查询数据源,默认为一个空数组
    if (this.initFormOptions && typeof this.initFormOptions === 'function') {
      this.initFormOptions(
        this.searchFormOptions,
        keys,
        this.searchFormFields,
        false
      );
    }
    //查询日期设置为可选开始与结果日期
    if (this.searchFormOptions && Array.isArray(this.searchFormOptions)) {
      this.searchFormOptions.forEach((item) => {
        if (item && Array.isArray(item)) {
          item.forEach((x) => {
            if (x && (x.type == 'date' || x.type == 'datetime')) x.range = true;
          });
        }
      });
    }
    //初始化datatable表数据源,默认为一个空数组,dicKeys为界面所有的数据字典编号
    if (this.initColumns && typeof this.initColumns === 'function') {
      this.initColumns(this.columns, this.dicKeys, keys);
    }
  },

  //初始化按钮
  initBoxButtons() {
    let path = this.$route ? this.$route.path : '';
    //通过菜单获取用户所对应菜单需要显示的按钮
    let permissionButtons = this.permission ? this.permission.getButtons(
      path,
      null,
      this.extend ? this.extend.tableAction : null,
      this.table ? this.table.name : ''
    ) : [];
    if (permissionButtons && Array.isArray(permissionButtons)) {
      //添加深拷贝按钮组
      permissionButtons.forEach((p) => {
        let _obj = {};
        for (const key in p) {
          _obj[key] = p[key];
        }
        this.buttons.push(_obj);
      });
    }
    if (!this.extend) {
      this.extend = {};
    }
    //扩展方法中的自定义按钮
    if (this.extend.buttons && this.extend.buttons.view) {
      this.extendBtn(this.buttons, this.extend.buttons.view);
    }
  }
};

export default methods;